home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
ste
/
double2.lzh
/
DOUBLE2.S
< prev
next >
Wrap
Text File
|
1991-07-02
|
6KB
|
205 lines
start: opt o+
bra install
scroll_vbl: movem.l d0-d2/d7,-(sp) ;save registers
move.w screen_pos(pc),d0 ;top of screen
move.w d0,d7
save_mouse_y: move.w $0.l,d1 ;mouse y-pos
move.w d1,d2
margin1: addi.w #50,d0 ;x lines from top
sub.w d0,d1 ;mouse-screen
blt.s scroll_down
margin2: addi.w #400-(2*50),d0 ;x lines from bottom
sub.w d0,d2 ;mouse-screen
bgt.s scroll_up
end_vbl: movem.l (sp)+,d0-d2/d7 ;save registers
vbl_return: jmp $0.l ;return to real vbl
scroll_down: add.w d1,d7 ;scroll screen down
bgt.s set_new_pos ;past top of screen ?
clr.w d7 ;yes, set to top
bra.s set_new_pos
scroll_up: add.w d2,d7 ;scroll screen up
lines1: cmpi.w #800-400,d7 ;past end of screen
blt.s set_new_pos
lines2: move.w #800-400,d7 ;yes, set to bottom
set_new_pos: move.w d7,screen_pos ;save new position
offset1: mulu.w #80,d7 ;byte position
add.l logical(pc),d7 ;offset for screen
set_video_adr: move.l d7,screen_adr
move.b screen_adr+1(pc),$FFFF8201.w ;high
move.b screen_adr+2(pc),$FFFF8203.w ;middle
move.b screen_adr+3(pc),$FFFF820D.w ;low (only ste)
bra.s end_vbl
interl_vbl: movem.l d0-d2/d7,-(sp)
move.l logical(pc),d7
tst.b screen_pos
beq.s second_screen
clr.b screen_pos
bra.s set_video_adr
second_screen: move.b #1,screen_pos
offset2: addi.l #80,d7
bra.s set_video_adr
new_gem: cmpi.w #$73,d0 ;vdi call ?
bne.s return ;no - return
move.l d1,a0 ;pointer to pb
move.l (a0),a1 ;pointer to control
cmpi.w #1,(a1) ;control(0)=1 ?
bne.s return ;no - return
move.l 12(a0),after_call+2 ;pointer to int_out
move.l 2(a7),save_return+2 ;real return adress
move.l #after_call,2(a7) ;fake return adress
return: jmp $0.l ;to standard trap #2
after_call: move.l #$0,a0 ;pointer to int_out
lines3: move.w #800-1,2(a0) ;y-size in int_out(1)
save_linea: move.l #$0,a0 ;linea pointer
lines4: move.w #800,-4(a0) ;vertical res
chars1: move.w #25-1,-42(a0) ;chars height -1
lines5: move.w #800-1,-690(a0) ;int_out(1)
move.w return(pc),new_gem
move.l return+2(pc),new_gem+2
save_return: jmp $0.l ;and to program
screen_pos: dc.w 0 ;line at top of screen
screen_adr: ds.l 1 ;to calculate adress
logical: ds.l 1 ;logical screen adress
print_info: pea info(pc) ;info text
move.w #$09,-(sp) ;print line
trap #1 ;gemdos
addq.l #6,sp
rts
install: move.w #-1,-(sp) ;read status
move.w #11,-(sp) ;kbshift
trap #13 ;bios
addq.l #4,sp
andi.b #3,d0 ;SHIFT pressed ?
move.b d0,d7 ;Save SHIFT status
bne.s set_it_up ;yep, install
bsr.s print_info ;print info & help
clr.w -(sp) ;terminate
trap #1 ;gemdos
set_it_up: lea stack(pc),sp ;set up new stack
move.l #(stack-start)+$100,-(sp) ;reserve only
move.l #start-$100,-(sp) ;needed memory
clr.w -(sp)
move.w #$4A,-(sp) ;setblock
trap #1 ;gemdos
lea 12(sp),sp
clr.l -(sp) ;super mode
move.w #$20,-(sp) ;super
trap #1 ;gemdos
addq.l #6,sp
move.l #-1,-(sp) ;get free bytes
move.w #$48,-(sp) ;malloc
trap #1 ;gemdos
addq.l #6,sp
subi.l #32000,d0 ;everything except
move.l d0,-(sp) ;32000 bytes extra
move.w #$48,-(sp) ;malloc
trap #1 ;gemdos
addq.l #6,sp
move.l d0,d6 ;save start (for mfree)
move.l #32000,-(sp) ;get last 32000 bytes
move.w #$48,-(sp) ;malloc
trap #1 ;gemdos
addq.l #6,sp
move.l d0,$436.w ;new _memtop
move.l d0,logical ;new logical screen
move.l d6,-(sp) ;area to free again
move.w #$49,-(sp) ;mfree
trap #1
addq.l #6,sp
cmpi.b #2,$44C.w ;monochrome ?
beq.s countinue ;yes, do nothing
bsr set_up_color ;no, set up for color
countinue: move.w #-1,-(sp) ;retain resolution
move.l logical(pc),-(sp)
move.l logical(pc),-(sp)
move.w #5,-(sp) ;setscreen
trap #14 ;xbios
lea 12(sp),sp
dc.w $A000 ;get linea adress
move.l a0,save_linea+2
lines6: move.w #800,-4(a0) ;vertical res
move.w #800/16-1,-42(a0) ;chars-1
suba.l #600,a0 ;mouse y variable
move.l a0,save_mouse_y+2 ;and save adress
clr.b info2 ;skip help info
bsr print_info ;info text on screen
move.l $88.w,return+2 ;save trap #2 adress
move.l #new_gem,$88.w ;set new trap #2 adress
move.l $70.w,vbl_return+2 ;save old vbl
btst.l #0,d7 ;Interlace mode
beq.s offset3 ;yes, install it
move.l #scroll_vbl,$70.w ;no, set new vbl
bra.s exit ;and exit
offset3: move.b #40,$FFFF820F.w ;80 bytes offset
move.w #50-1,chars1+2 ;50 chars heigth -1
move.l #interl_vbl,$70.w ;set new vbl
exit: clr.w -(sp)
move.l #(print_info-start)+$100,-(sp)
move.w #$31,-(sp)
trap #1
set_up_color: move.w #400,d0 ;all 400 places
move.w d0,lines4+2
move.w d0,lines6+2
subq.w #1,d0 ;all 400-1 places
move.w d0,lines3+2
move.w d0,lines5+2
move.w #400-200,d0 ;all 400-200 places
move.w d0,lines1+2
move.w d0,lines2+2
move.l #160,d0 ;all 160 places
move.w d0,offset1+2
move.l d0,offset2+2
move.w #80,offset3+2 ;all 80 places
move.w #25,margin1+2 ;all 25 places
move.w #200-(2*25),margin2+2 ;all 200-(2*25) places
rts
info: dc.b 27,'E',10,' STE Double-Height Emulator 2.01'
dc.b 13,10,10, ' (C) Lars-Erik Østerud 02/07-1991'
dc.b 13,10,10
info2: dc.b 10,' RIGHT-SHIFT for Scrolling Display',13,10,10
dc.b ' LEFT-SHIFT for Interlaced Display',13,10,10,0
section bss
ds.l 10 ;place for program stack
stack: